const express = require('express');
const cors = require('cors');
const path = require('path');
const fs = require('fs');

const app = express();
const PORT = 3001;
const DB_FILE = path.join(__dirname, 'data.json')

// 请求处理中间件
app.use(express.json()); 
// 解决跨域问题的中间件
app.use(cors());
// 配置静态资源，绝对路径
app.use(express.static(path.join(__dirname, 'public')));

let todos = [
    { id: 1, title: '速成 Express', done: true },
    { id: 2, title: '完成 TodoList 案例', done: false },
];

let nextId =3;

function loadTodos () {
    if (fs.existsSync(DB_FILE)) {
        try {
            const raw = fs.readFileSync(DB_FILE, 'utf-8');
            todos = JSON.parse(raw);
            nextId = todos.length > 0 ? Math.max(...todos.map(t => t.id)) + 1 : 1;
        } catch (e) {
            console.error('读取 data.json 失败', e);
            todos = []
        }
    }
};
loadTodos();

function saveTodos () {
    try {
        fs.writeFileSync(DB_FILE, JSON.stringify(todos, null, 2));
    } catch (e) {
        console.log('保存数据失败：', e);
    }
};

// 查询列表
app.get('/api/todos', (req, res) => {
    res.json(todos); 
});

// 新增数据
app.post('/api/todos', (req, res) => {
    // 查询 title 字段是否存在
    const { title } = req.body
    if (!title || typeof title !== 'string') {
        return res.status(400).json({ error: 'title不能为空' });
    }
    // title 存在设置好数据
    const newTodo = { id: nextId++, title, done: false };
    // 新增至列表
    todos.push(newTodo);
    // 保存
    saveTodos();
    // 返回状态码
    res.status(201).json(newTodo);
});

// 修改数据
app.patch('/api/todos/:id', (req, res) => {
    // 查询修改的数据id是否存在
    const id = parseInt(req.params.id);
    const todo = todos.find(t => t.id === id);
    if (!todo) {
        return res.status(404).json({ error: 'Todo 不存在' });
    }
    // 检查信息是否正确并修改
    const { title, done } = req.body;
    if(typeof title === 'string') todo.title = title;
    if(typeof done === 'boolean') todo.done = done;
    // 保存
    saveTodos();
    // 响应
    res.json(todo);
});

// 删除
app.delete('/api/todos/:id', (req, res) => {
    // 查询修改的数据id是否存在
    const id = parseInt(req.params.id);
    const index = todos.findIndex(t => t.id === id);
    if(index === -1) {
        return res.status(404).json({ error: 'Todo 不存在' });
    }
    // 找到数组下标，删除
    todos.splice(index, 1);
    // 保存
    saveTodos();
    // 响应
    res.status(204).end();
});

app.listen(PORT, () => {
    console.log(`本地服务启动Server running at http://localhost:${PORT}`)
})